package com.es.test.utils;

/**
 * @author django
 * @date 2024/2/1
 * @description TODO
 */

import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.es.test.dto.LabelInfo;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.reflect.FieldUtils;

import java.lang.reflect.Field;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

public class LabelInfoListener extends AnalysisEventListener<LabelInfo> {

    private final List<LabelInfo> dataList;

    public LabelInfoListener(List<LabelInfo> dataList) {

        this.dataList = dataList;
    }

    // 每读取一行数据，会调用一次该方法
    @Override
    public void invoke(LabelInfo data, AnalysisContext context) {

        // 在这里添加空值检查
        if (data != null) {
            handleNullDates(data);
            dataList.add(data);
        }
     }

    // 读取完整个 Excel 文件后会调用该方法
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        // 数据处理完成，可以进行后续的业务逻辑
        // 在这个示例中，将 dataList 传递给上层的处理逻辑

        processReadData(dataList);
    }

    private void processReadData(List<LabelInfo> dataList) {
        // 处理读取到的数据，可以在这里进行你的业务逻辑

    }
    private boolean allDatesNotNull(LabelInfo data) {
        Field[] fields = FieldUtils.getAllFields(LabelInfo.class);
        for (Field field : fields) {
            if (field.getType().equals(Date.class)) {
                try {
                    Date date = (Date) FieldUtils.readField(field, data, true);
                    if (date == null  ) {
                        return false;
                    }
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
        return true;
    }
    private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); // 根据实际日期格式进行设置

    // 辅助方法，处理日期为 null 的情况
    private void handleNullDates(LabelInfo data) {
        Field[] fields = FieldUtils.getAllFields(LabelInfo.class);
        for (Field field : fields) {
            if (field.getType().equals(Date.class)) {
                try {
                    String dateStr = (String) FieldUtils.readField(field, data, true);
                    if (StringUtils.isNotBlank(dateStr) && !dateStr.equalsIgnoreCase("null")) {
                        Date date = dateFormat.parse(dateStr);
                        FieldUtils.writeField(field, data, date, true);
                    } else {
                        FieldUtils.writeField(field, data, null, true);
                    }
                } catch (ParseException | IllegalAccessException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
